package com.gitee.zhanyao.sms.tencentcloud;

import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.*;

/**
 * 腾讯云短信服务
 * API文档：https://cloud.tencent.com/document/product/382
 */
public class TencentSmsService {

    /**
     * 添加短信模版
     *
     * @param secretId        安全凭证SecretId 用于标识 API 调用者身份
     * @param secretKey       安全凭证SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥。
     * @param templateName    模板名称。
     * @param templateContent 模板内容。
     * @param remark          模板备注，例如申请原因，使用场景等。
     * @param smsType         短信类型，0表示普通短信, 1表示营销短信。
     * @param international   是否国际/港澳台短信：0：表示国内短信。1：表示国际/港澳台短信。
     * @return AddSmsTemplateResponse
     * @throws TencentCloudSDKException
     */
    public static AddSmsTemplateResponse addSmsTemplate(String secretId, String secretKey, String templateName,
                                                 String templateContent, String remark, Long smsType, Long international)
            throws TencentCloudSDKException {
        Credential cred = new Credential(secretId, secretKey);
        SmsClient client = new SmsClient(cred, "");
        AddSmsTemplateRequest req = new AddSmsTemplateRequest();
        req.setTemplateName(templateName);
        req.setTemplateContent(templateContent);
        req.setSmsType(smsType);
        req.setInternational(international);
        req.setRemark(remark);
        return client.AddSmsTemplate(req);
    }

    /**
     * 修改短信模版
     *
     * @param secretId        安全凭证SecretId 用于标识 API 调用者身份
     * @param secretKey       安全凭证SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥。
     * @param templateId      待修改的模板的模板 ID。
     * @param templateName    模板名称。
     * @param templateContent 模板内容。
     * @param remark          模板备注，例如申请原因，使用场景等。
     * @param smsType         短信类型，0表示普通短信, 1表示营销短信。
     * @param international   是否国际/港澳台短信：0：表示国内短信。1：表示国际/港澳台短信。
     * @return ModifySmsTemplateResponse
     * @throws TencentCloudSDKException
     */
    public static ModifySmsTemplateResponse modifySmsTemplate(String secretId, String secretKey, Long templateId, String templateName,
                                                       String templateContent, String remark, Long smsType, Long international)
            throws TencentCloudSDKException {
        Credential cred = new Credential(secretId, secretKey);
        SmsClient client = new SmsClient(cred, "");
        ModifySmsTemplateRequest req = new ModifySmsTemplateRequest();
        req.setTemplateId(templateId);
        req.setTemplateName(templateName);
        req.setTemplateContent(templateContent);
        req.setSmsType(smsType);
        req.setInternational(international);
        req.setRemark(remark);
        return client.ModifySmsTemplate(req);
    }

    /**
     * 短信模板状态查询
     *
     * @param secretId      安全凭证SecretId 用于标识 API 调用者身份
     * @param secretKey     安全凭证SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥。
     * @param templateIdSet 模板 ID 数组。
     * @param international 是否国际/港澳台短信：0：表示国内短信。1：表示国际/港澳台短信。
     * @return DescribeSmsTemplateListResponse
     * @throws TencentCloudSDKException
     */
    public static DescribeSmsTemplateListResponse describeSmsTemplateList(String secretId, String secretKey, Long[] templateIdSet,
                                                             Long international) throws TencentCloudSDKException {
        Credential cred = new Credential(secretId, secretKey);
        SmsClient client = new SmsClient(cred, "");
        DescribeSmsTemplateListRequest req = new DescribeSmsTemplateListRequest();
        req.setTemplateIdSet(templateIdSet);
        req.setInternational(international);
        return client.DescribeSmsTemplateList(req);
    }

    /**
     * 删除短信模版
     *
     * @param secretId   安全凭证SecretId 用于标识 API 调用者身份
     * @param secretKey  安全凭证SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥。
     * @param templateId 待删除的模板 ID。
     * @return DeleteSmsTemplateResponse
     * @throws TencentCloudSDKException
     */
    public static DeleteSmsTemplateResponse deleteSmsTemplate(String secretId, String secretKey, Long templateId)
            throws TencentCloudSDKException {
        Credential cred = new Credential(secretId, secretKey);
        SmsClient client = new SmsClient(cred, "");
        DeleteSmsTemplateRequest req = new DeleteSmsTemplateRequest();
        req.setTemplateId(templateId);
        return client.DeleteSmsTemplate(req);
    }

    /**
     * 发送短信
     *
     * @param secretId       安全凭证SecretId 用于标识 API 调用者身份
     * @param secretKey      安全凭证SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥。
     * @param smsSdkAppid    短信SdkAppid，在 短信控制台 添加应用后生成的实际SdkAppid
     * @param sign           短信签名内容，使用 UTF-8 编码，必须填写已审核通过的签名，签名信息可登录 短信控制台 查看。注：国内短信为必填参数。
     * @param templateId     模板 ID，必须填写已审核通过的模板 ID。
     * @param phoneNumberSet 下发手机号码，采用 e.164 标准，格式为+[国家或地区码][手机号]，单次请求最多支持200个手机号且要求全为境内手机号或全为境外手机号。
     *                       例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号。
     * @param templateParams 模板参数，若无模板参数，必须设置为空数组。
     * @return SendSmsResponse
     * @throws TencentCloudSDKException
     */
    public static SendSmsResponse sendSms(String secretId, String secretKey, String smsSdkAppid, String sign, String templateId,
                                   String[] phoneNumberSet, String[] templateParams) throws TencentCloudSDKException {
        Credential cred = new Credential(secretId, secretKey);
        SmsClient client = new SmsClient(cred, "");
        SendSmsRequest req = new SendSmsRequest();
        req.setSmsSdkAppid(smsSdkAppid);
        req.setSign(sign);
        req.setTemplateID(templateId);
        req.setPhoneNumberSet(phoneNumberSet);
        req.setTemplateParamSet(templateParams);
        return client.SendSms(req);
    }


}
